package main

import "strconv"

// 对应的余数序列：5 → 7 → 3 → 9 → 2 → 5 → 7 → 3 → 8 → 4 → 5 → 7 → 3 → 9 → 2 → 5...
// 注意这里的规律：
// 结果中虽然有多个 1 重复出现（比如第 1 位和第 3 位都是 1），但它们对应的余数不同（第 1 位 1 对应余数 5，第 3 位 1 对应余数 3）
// 只有当相同的余数再次出现时（比如余数 5 第一次出现在位置 2，第二次出现在位置 6），才会触发循环判断
func fractionToDecimal(numerator int, denominator int) string {
	sign := ""
	if numerator*denominator < 0 {
		sign = "-"
	}
	numerator = abs(numerator)
	denominator = abs(denominator)
	q, r := numerator/denominator, numerator%denominator
	if r == 0 {
		return sign + strconv.Itoa(q)
	}
	ans := []byte(sign + strconv.Itoa(q) + ".")
	rToPos := map[int]int{r: len(ans)}
	for r != 0 {
		r *= 10
		q = r / denominator
		r %= denominator
		ans = append(ans, '0'+byte(q))
		// 4. 检测循环节：若当前余数已出现过，说明从上次位置到现在是循环节
		if pos, ok := rToPos[r]; ok {
			// 在循环节开始位置插入"(", 末尾添加")"（如 "0.142857" → "0.(142857)"）
			return string(ans[:pos]) + "(" + string(ans[pos:]) + ")"
		}
		rToPos[r] = len(ans)
	}
	return string(ans)
}

func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}

//package main
//
//import (
//    "strconv"
//)
//
//// fractionToDecimal 将分数 numerator/denominator 转换为字符串形式
//// 若存在循环小数，用括号标记循环节（如 1/3 → "0.(3)"）
//func fractionToDecimal(numerator, denominator int) string {
//    // 处理符号：若分子分母异号，结果为负数
//    sign := ""
//    if numerator*denominator < 0 {
//        sign = "-"
//    }
//
//    // 转为绝对值计算，避免负数影响除法逻辑（确保后续计算均为非负数）
//    numerator = abs(numerator)
//    denominator = abs(denominator)
//
//    // 计算整数部分：q是商，r是余数（numerator = q*denominator + r）
//    q, r := numerator/denominator, numerator%denominator
//    if r == 0 { // 余数为0，说明是整数，直接返回带符号的整数部分
//        return sign + strconv.Itoa(q)
//    }
//
//    // 初始化结果：符号 + 整数部分 + 小数点（如 "-3.")
//    ans := []byte(sign + strconv.Itoa(q) + ".")
//
//    // 哈希表：记录每个余数首次出现的位置（用于检测循环节）
//    // 键：余数r，值：该余数在结果字符串中的索引位置
//    rToPos := map[int]int{r: len(ans)}
//
//    // 循环计算小数部分，直到余数为0（有限小数）或检测到循环节
//    for r != 0 {
//        // 1. 余数补0（模拟手动除法中"移下一位"的操作）
//        r *= 10
//
//        // 2. 计算当前小数位的数字（商），并更新余数
//        q = r / denominator   // 当前小数位（如 r=10, denominator=3 → q=3）
//        r = r % denominator   // 更新余数（如 10%3=1）
//
//        // 3. 将当前小数位加入结果（'0'+byte(q) 把数字转为对应ASCII字符）
//        ans = append(ans, '0'+byte(q))
//
//        // 4. 检测循环节：若当前余数已出现过，说明从上次位置到现在是循环节
//        if pos, ok := rToPos[r]; ok {
//            // 在循环节开始位置插入"(", 末尾添加")"（如 "0.142857" → "0.(142857)"）
//            return string(ans[:pos]) + "(" + string(ans[pos:]) + ")"
//        }
//
//        // 5. 记录当前余数及其在结果中的位置（供后续循环节检测）
//        rToPos[r] = len(ans)
//    }
//
//    // 若循环结束（r=0），说明是有限小数，直接返回结果
//    return string(ans)
//}
//
//// abs 辅助函数：返回整数的绝对值
//func abs(x int) int {
//    if x < 0 {
//        return -x
//    }
//    return x
//}
